#include <iostream>
#include <memory>

class Test
{
public:
    Test()
    {
        std::cout<<"构造函数\n";
    }
    ~Test()
    {
        std::cout<<"析构函数\n";
    }
    void show()
    {
        std::cout<<"123465\n";
    }

};

// template<typename T>
// class SmartPoint
// {
// public:
//     SmartPoint(T *p):p(p){}
//     ~SmartPoint()
//     {
//         delete p;
//     }
// private:
//     T *p;
//     static int conut;
// };
// static int SmartPoint::count = 0;

using TestPtr = std::shared_ptr<Test>;

class Derived : public Test
{

};

int main()
{
    // std::shared_ptr<Test> p = std::make_shared<Test>();
    // p->show();
    // std::shared_ptr<Test> p2 = p;
    // p2->show();
    // std::shared_ptr<Test> p3;
    // p3 = p;
    // p3->show();
    // //不再有指针指向这块内存，释放内存

    // std::cout<<p.use_count()<<std::endl; //引用计数器：当前有多少个指针指向该内存
    
    // Test *t = new Test;
    // std::shared_ptr<Test> p(t);
    // std::shared_ptr<Test> p1(t);
    //共享只能发生在智能指针之间，裸指针赋值智能指针不能共享

    //裸指针和智能指针不能混用
   TestPtr p = std::make_shared<Derived>();
   // dynamic_point_cast<Derived*>(p.get());

    return 0;
}